﻿#pragma once

#include <QLineEdit>
#include <QPushButton>
#include "../../widgets/khistorypopup/khistorypopup.h"
#include "../../model/kexpressionbuffer/kexpressionbuffer.h"

//按钮信息结构体：包含表达式 token、界面显示文本、图标
class ButtonInfo {
public:
    ButtonInfo(const QString& t, const QString& d, const QIcon& i)
        : token(t), displayText(d), icon(i) {}
    ~ButtonInfo() {}


    QString token; //内部逻辑用表达式内容
    QString displayText; //界面显示文本
    QIcon   icon; //按钮图标（优先于文字显示）
};

//主显示视图类：管理界面中所有组件显示和布局
class DisplayView : public QWidget {
    Q_OBJECT
public:
    explicit DisplayView(QWidget* parent = nullptr);

    ~DisplayView(){};

    //获取所有按钮（用于绑定信号）
    QList<QPushButton*> allButtons() const;

    //设置窗口属性（背景、图标、标题）
    void setupWindowProperties();

    //设置主布局拉伸策略
    void setupMainLayout();

    //初始化历史表达式栏
    void setupHistoryDisplay();

    //初始化主结果显示栏
    void setupResultDisplay();

    //创建所有功能按钮
    void createButtons();

    //设置主结果栏内容
    void setExpression(const QString& expr);

    //设置历史表达式栏内容
    void setProcessExpression(const QString& history);

    //获取按钮区域顶部 y 坐标（用于弹出动画）
    int getButtonAreaTop() const;

    //获取历史栏切换按钮
    QPushButton* historyToggleButton() const;

    //获取历史记录弹出层对象
    HistoryPopup* historyPopup() const;

protected:
    //窗口尺寸变化时调整字体大小
    void resizeEvent(QResizeEvent* event);

private:
    //根据窗口高度动态调整字体大小
    void updateFontSize();

    //创建单个按钮（包装 info）
    QPushButton* createButton(const ButtonInfo& info);

    //设置按钮内容（文字或图标）
    void setupButtonContent(QPushButton* button, const ButtonInfo& info);

    //设置按钮样式（颜色、边框、圆角等）
    void setupButtonStyle(QPushButton* button, const ButtonInfo& info);

    //判断按钮是否为运算符/函数
    bool isOperatorOrFunction(const QString& token);

    //设置为大字体
    void setLargeFont();

    //设置为小字体
    void setSmallFont();

    //初始化顶部栏（含模式、设置、历史按钮）
    void setupTopBar();

    //初始化历史记录弹出层
    void setupHistoryPopup();

private:
    //历史表达式显示框
    QLineEdit* m_pprocessLineEdit;

    //主结果显示框
    QLineEdit* m_pdisplayLineEdit;

    //所有功能按钮列表
    QList<QPushButton*> m_pbuttons;

    //历史栏按钮
    QPushButton* m_phistoryButton;

    //历史记录弹出层对象
    HistoryPopup* m_phistoryPopup = nullptr;

    //表达式数据缓冲区（用于 token 管理）
    ExpressionBuffer m_exprBuffer;
};


